/*(C) Copyright

    This file is part of widget Meteoclimatic. 
    Autor: Antonio Cristóbal Álvarez Abellán -> acabellan@gmail.com
    
    */

package deeloco.android.meteoclimatic.donate;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

/**
 * Clase que permite gestionar las alarmas meteorológicas
 * @author Antonio Cristóbal Álvarez Abellán
 *
 */

public class alarmaMeteorologica {
	
	
	/**
	 * ATRIBUTOS
	 */
	private String nombre; //Nombre de la estación
	private String codigo; //Código de la estación
	private datosMeteorologicos datosMeteo = new datosMeteorologicos(); //Datos meteorológicos
	private datosMeteorologicos datosMeteoPrev=new datosMeteorologicos(); //Datos meteorológicos previos
	private double difPresion;
	private double incrementoLluvia;
	private Context contexto;
	private int appWidgetId;
	private String strRingtonePreference;
	private estacion miEstacion;
	
	
	/**
	 * CONSTRUCTORES
	 */
		
	public alarmaMeteorologica() 
	{
		
	}
	
	public alarmaMeteorologica(Context contexto,int appWidgetId,String nombre, String codigo,datosMeteorologicos datosMeteo) {
		this.contexto=contexto;
		this.nombre = nombre;
		this.codigo = codigo;
		this.datosMeteo=datosMeteo;
		this.appWidgetId=appWidgetId;
		this.strRingtonePreference = PreferenceManager.getDefaultSharedPreferences(this.contexto).getString("ringtonePref", "DEFAULT_SOUND");
	}
		
	/**
	 * GETTER Y SETTER
	 */
	
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getCodigo() {
		return codigo;
	}
	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}
	public datosMeteorologicos getDatosMeteo() {
		return datosMeteo;
	}
	public void setDatosMeteo(datosMeteorologicos datosMeteo) {
		this.datosMeteoPrev=this.datosMeteo;
		this.datosMeteo = datosMeteo;
	}
	public int getAppWidgetId() {
		return appWidgetId;
	}
	public void setAppWidgetId(int appWidgetId) {
		this.appWidgetId = appWidgetId;
	}

	/**
	 * MÉTODOS
	 */
	

	/**
	 * Carga los valores de los parámetros que necesita la clase para funcionar.
	 * @param contexto Context
	 * @param appWidgetId Integer
	 * @param nombre String
	 * @param codigo String
	 * @param datosMeteo datosMeteorologicos
	 * @param datosMeteoPrev datosMeteorologicos
	 * @param incrementoPresion double
	 * @param incrementoLluvia double
	 */
	public void setParam(Context contexto,int appWidgetId,estacion estacion) 
	{	
		this.contexto=contexto;
		this.nombre = estacion.getNombre();
		this.codigo = estacion.getCodigo();
		this.datosMeteoPrev=estacion.getDatosMeteoPrev();
		this.datosMeteo=estacion.getDatosMeteo();
		this.appWidgetId=appWidgetId;
		this.difPresion=estacion.diferenciaPresion();
		this.incrementoLluvia=estacion.incrementoLluvia();
		this.miEstacion=estacion;

		Log.d("alarmaMeteo","Alarma Temp(antes,desp).:("+this.datosMeteoPrev.T+","+this.datosMeteo.T+")");
		Log.d("alarmaMeteo","Alarma Lluvia(incremento).:("+this.incrementoLluvia+")");
		Log.d("alarmaMeteo","Alarma Viento(antes,desp).:("+this.datosMeteoPrev.W+","+this.datosMeteo.W+")");
		Log.d("alarmaMeteo","Alarma Presion(incremento).:("+this.difPresion+")");
		Log.d("alarmaMeteo","Alarma Humedad(antes,desp).:("+this.datosMeteoPrev.H+","+this.datosMeteo.H+")");
	}
	
	/**
	 * Comprueba si las alarmas se cumplen y lanzar la alarma en el áres de notificación.
	 */
	public void comprobarAlarmas()
	{
		
		this.strRingtonePreference = PreferenceManager.getDefaultSharedPreferences(contexto).getString("ringtonePref", "DEFAULT_SOUND");        

		//ALARMA TEMPERATURA ALTA
		comprobarAlarmaTempAlta();
			
		//ALARMA TEMPERATURA BAJA
		comprobarAlarmaTempBaja();
	
		//ALARMA LLUVIA
		comprobarAlarmaLluvia();
			
		//ALARMA VIENTO
		comprobarAlarmaViento();
		
		//COMPROBAR ALARMA PRESIÓN
		comprobarAlarmaPresion();
		
		//ALARMA HUMEDAD ALTA
		comprobarAlarmaHumedadAlta();
		
		//ALARMA HUMEDAD BAJA
		comprobarAlarmaHumedadBaja();
	}
		
	/**
	 * Comprueba si los parametros y datos meteorológicos tienen unos valores suficientes para disparar una alarma por 
	 * temperatura alta. Si se cumplen los datos, se lanza la alarma
	 */
	public void comprobarAlarmaTempAlta()
	{
		boolean alarmaTempActivadaAlta=PreferenceManager.getDefaultSharedPreferences(contexto).getBoolean("chbox_alarmaTempAlta"+"_"+appWidgetId, false);
		
		//ALARMA TEMPERATURA ALTA
		if (alarmaTempActivadaAlta) 
		{ 
			double alarmaTempAlta=Double.parseDouble(PreferenceManager.getDefaultSharedPreferences(contexto).getString("txt_valorAlarmaTempAlta"+"_"+appWidgetId, "99"));
			Log.d("alarmaMeteorológica", "Comprobando alarma.T.Alta="+alarmaTempAlta);
			Log.d("alarmaMeteorológica", "Temp. Actual="+datosMeteo.T);
			Log.d("alarmaMeteorológica", "Temp. Previa="+datosMeteoPrev.T);
			if ((datosMeteo.T>alarmaTempAlta)&&(datosMeteoPrev.T<alarmaTempAlta))
			{
				//Lanzar alarma de temperatura máxima
				Log.d("alarmaMeteorológica", "Lanzando alarma");
				lanzarNotificacion(contexto.getString(R.string.alarma_temp_alta_Titulo), datosMeteo.T,"ºC",this.miEstacion);
			}
		}
	}

	
	/**
	 * Comprueba si los parametros y datos meteorológicos tienen unos valores suficientes para disparar una alarma por 
	 * temperatura baja. Si se cumplen los datos, se lanza la alarma
	 */
	public void comprobarAlarmaTempBaja()
	{
		boolean alarmaTempActivadaBaja=PreferenceManager.getDefaultSharedPreferences(contexto).getBoolean("chbox_alarmaTempBaja"+"_"+appWidgetId, false);
		
		//ALARMA TEMPERATURA ALTA
		if (alarmaTempActivadaBaja) 
		{ 
			double alarmaTempBaja=Double.parseDouble(PreferenceManager.getDefaultSharedPreferences(contexto).getString("txt_valorAlarmaTempBaja"+"_"+appWidgetId, "99"));
			Log.d("alarmaMeteorológica", "Comprobando alarma.T.Baja="+alarmaTempBaja);
			Log.d("alarmaMeteorológica", "Temp. Actual="+datosMeteo.T);
			Log.d("alarmaMeteorológica", "Temp. Previa="+datosMeteoPrev.T);
			if ((datosMeteo.T<alarmaTempBaja)&&(datosMeteoPrev.T>alarmaTempBaja))
			{
				//Lanzar alarma de temperatura máxima
				Log.d("alarmaMeteorológica", "Lanzando alarma Temp. Baja");
				lanzarNotificacion(contexto.getString(R.string.alarma_temp_baja_Titulo), datosMeteo.T,"ºC", this.miEstacion);
			}
		}
	}


	/**
	 * Comprueba si los parametros y datos meteorológicos tienen unos valores suficientes para disparar una alarma de lluvia. 
	 * Si se cumplen los datos, se lanza la alarma
	 */
	public void comprobarAlarmaLluvia()
	{
		boolean alarmaLluviaActivada=PreferenceManager.getDefaultSharedPreferences(contexto).getBoolean("chbox_alarmaLluvia"+"_"+appWidgetId, false);
		
		//ALARMA lluvia
		if (alarmaLluviaActivada) 
		{ 
			double alarmaLluvia=Double.parseDouble(PreferenceManager.getDefaultSharedPreferences(contexto).getString("txt_valorAlarmaLluvia"+"_"+appWidgetId, "99"));
			Log.d("alarmaMeteorológica", "Comprobando alarma.Lluvia="+alarmaLluvia+". Incremento de lluvia="+this.incrementoLluvia);
			if (this.incrementoLluvia>alarmaLluvia)
			{
				//Lanzar alarma de temperatura máxima
				Log.d("alarmaMeteorológica", "Lanzando alarma Lluvia");
				lanzarNotificacion(contexto.getString(R.string.alarma_lluvia_Titulo), datosMeteo.P,"mm", this.miEstacion);
			}

		}
	}


	/**
	 * Comprueba si los parametros y datos meteorológicos tienen unos valores suficientes para disparar una alarma de viento. 
	 * Si se cumplen los datos, se lanza la alarma
	 */
	public void comprobarAlarmaViento()
	{
		boolean alarmaVientoActivada=PreferenceManager.getDefaultSharedPreferences(contexto).getBoolean("chbox_alarmaViento"+"_"+appWidgetId, false);
		
		//ALARMA lluvia
		if (alarmaVientoActivada) 
		{ 
			double alarmaViento=Double.parseDouble(PreferenceManager.getDefaultSharedPreferences(contexto).getString("txt_valorAlarmaViento"+"_"+appWidgetId, "99"));
			Log.d("alarmaMeteorológica", "Comprobando alarma.Viento="+alarmaViento);
			Log.d("alarmaMeteorológica", "Viento. Actual="+datosMeteo.W);
			Log.d("alarmaMeteorológica", "Viento. Previa="+datosMeteoPrev.W);
			if ((this.datosMeteo.W>alarmaViento)&&(this.datosMeteoPrev.W<alarmaViento))
			{
				//Lanzar alarma de temperatura máxima
				Log.d("alarmaMeteorológica", "Lanzando alarma Viento");
				lanzarNotificacion(contexto.getString(R.string.alarma_viento_Titulo), datosMeteo.W,"km/h", this.miEstacion);
			}

		}
	}


	/**
	 * Comprueba si los parametros y datos meteorológicos tienen unos valores suficientes para disparar una alarma de viento. 
	 * Si se cumplen los datos, se lanza la alarma
	 */
	public void comprobarAlarmaPresion()
	{
		boolean alarmaPresionActivada=PreferenceManager.getDefaultSharedPreferences(contexto).getBoolean("chbox_alarmaPresion"+"_"+appWidgetId, false);
		
		//ALARMA PRESIÓN
		if (alarmaPresionActivada) 
		{ 
			double alarmaPresion=Double.parseDouble(PreferenceManager.getDefaultSharedPreferences(contexto).getString("txt_valorAlarmaPresion"+"_"+appWidgetId, "99"));
			Log.d("alarmaMeteorológica", "Comprobando alarma.Presion="+alarmaPresion);
			Log.d("alarmaMeteorológica", "Presión Ahora="+miEstacion.getDatosMeteo().B);
			Log.d("alarmaMeteorológica", "Presión Previa="+miEstacion.getDatosMeteoPrev().B);
			Log.d("alarmaMeteorológica", "Incremento de presión="+this.difPresion);
			
			if (this.difPresion>alarmaPresion)
			{
				//Lanzar alarma de temperatura máxima
				Log.d("alarmaMeteorológica", "Lanzando alarma Presión");
				lanzarNotificacion(contexto.getString(R.string.alarma_presion_Titulo), this.difPresion,"hPa", this.miEstacion);
			}

		}
	}

	
/**
 	* Comprueba alarma por humedad alta. Si se cumplen los datos, se lanza la alarma
 */
	public void comprobarAlarmaHumedadAlta()
	{
	boolean alarmaHumedadActivadaAlta=PreferenceManager.getDefaultSharedPreferences(contexto).getBoolean("chbox_alarmaHumedadAlta"+"_"+appWidgetId, false);
	
	//ALARMA HUMEDAD ALTA
	if (alarmaHumedadActivadaAlta) 
	{ 
		double alarmaHumedadAlta=Double.parseDouble(PreferenceManager.getDefaultSharedPreferences(contexto).getString("txt_valorAlarmaHumedadAlta"+"_"+appWidgetId, "99"));
		Log.d("alarmaMeteorológica", "Comprobando alarma.Max="+alarmaHumedadAlta+". Temp. Actual="+datosMeteo.H);
		if ((datosMeteo.H>alarmaHumedadAlta)&&(datosMeteoPrev.H<alarmaHumedadAlta))
		{
			//Lanzar alarma de temperatura máxima
			Log.d("alarmaMeteorológica", "Lanzando alarma");
			lanzarNotificacion(contexto.getString(R.string.alarma_humedad_alta_Titulo), datosMeteo.H,"%", this.miEstacion);
		}
	}
}


/**
 	* Comprueba alarma por humedad baja. Si se cumplen los datos, se lanza la alarma
 */
	public void comprobarAlarmaHumedadBaja()
	{
		boolean alarmaHumedadActivadaBaja=PreferenceManager.getDefaultSharedPreferences(contexto).getBoolean("chbox_alarmaHumedadBaja"+"_"+appWidgetId, false);
		
		//ALARMA TEMPERATURA ALTA
		if (alarmaHumedadActivadaBaja) 
		{ 
			double alarmaHumedadBaja=Double.parseDouble(PreferenceManager.getDefaultSharedPreferences(contexto).getString("txt_valorAlarmaHumedadBaja"+"_"+appWidgetId, "99"));
			Log.d("alarmaMeteorológica", "Comprobando alarma Hum Baja="+alarmaHumedadBaja+". Hum. Actual="+datosMeteo.H);
			Log.d("alarmaMeteorológica", "Humedad anterior="+datosMeteoPrev.H);
			if ((datosMeteo.H<alarmaHumedadBaja)&&(datosMeteoPrev.H>alarmaHumedadBaja))
			{
				//Lanzar alarma de temperatura máxima
				Log.d("alarmaMeteorológica", "Lanzando alarma Temp. Baja");
				lanzarNotificacion(contexto.getString(R.string.alarma_humedad_baja_Titulo), datosMeteo.H,"%", this.miEstacion);
				
			}
		}
	}

	/**
	 * Lanza una notificación con un titulo, un texto y abre los datos de una estación
	 * @param title
	 * @param texto
	 * @param codigo
	 * @param nombre
	 */
	private void lanzarNotificacion(String title,double medida, String unidadMedida,estacion miEstacion)
	{
//		NotificationManager mNotificationManager = (NotificationManager) contexto.getSystemService(Context.NOTIFICATION_SERVICE);
//		
//		int icon = R.drawable.icon;
//		CharSequence tickerText = contexto.getString(R.string.alarma_ticker);
//		long when = System.currentTimeMillis();
//		Notification notification = new Notification(icon, tickerText, when);
//		
//		notification.sound = Uri.parse(strRingtonePreference);
//		
//		CharSequence contentTitle = title;
//		CharSequence contentText = medida+unidadMedida+" en "+this.nombre;
//		Intent notificationIntent = new Intent(contexto,tabPantalla.class);
//		notificationIntent.putExtra("codigo", miEstacion.getCodigo());
//		notificationIntent.putExtra("nombre", miEstacion.getNombre());
//		notificationIntent.putExtra("estado", miEstacion.getEstado());
//		notificationIntent.putExtra("desEstado", miEstacion.getError());
//		
//  		PendingIntent contentIntent = PendingIntent.getActivity(contexto, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
//		notification.setLatestEventInfo(contexto, contentTitle, contentText,contentIntent);
//		mNotificationManager.notify(appWidgetId, notification);
		
		
		// Definimos el intent que llamaremos desde la notificación
		Intent notificationIntent = new Intent(contexto,tabPantalla.class);
		notificationIntent.putExtra("codigo", miEstacion.getCodigo());
		notificationIntent.putExtra("nombre", miEstacion.getNombre());
		notificationIntent.putExtra("estado", miEstacion.getEstado());
		notificationIntent.putExtra("desEstado", miEstacion.getError());
		PendingIntent contentPendingIntent = PendingIntent.getActivity(contexto, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
		
		NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(contexto)
			    .setSmallIcon(R.drawable.icon)
			    .setContentTitle(title)
			    .setContentText(medida+unidadMedida+" en "+this.nombre)
				.setContentIntent(contentPendingIntent);
		
		//Instancia del servicio Notificaciones Manager
		NotificationManager mNotificationManager = (NotificationManager) contexto.getSystemService(Context.NOTIFICATION_SERVICE);
		mNotificationManager.notify(appWidgetId, mBuilder.build());
	}

}

